package com.linwen.javase.desgin_pattern.create.singleton;

/**单例设计模式，顾名思义，全局中只能造一个类的实例
 * 饿汉式：
 *      在类加载时就要创建对象，加载慢
 *      是线程安全的
 * 懒汉式：
 *      在需要时创建对象，类的加载快
 *      以下写法是线程不安全的
 *      加了if 双重验证，线程安全
 * @author : linwen
 * @date : 下午5:02 2021/1/3
 */
public class 单例设计模式1 {
    public static void main(String[] args) {
        Bank b1 = Bank.getBank();
        Bank b2 = Bank.getBank();
        System.out.println(b1==b2);
        System.out.println(b1.getName());
        System.out.println("***********");
        Park park1 = Park.getInstance();
        Park park2 = Park.getInstance();
        System.out.println(park1==park2);

    }
}
//饿汉实现单例模式
class Bank{
    private static String name = "中国银行";
    public String getName(){
        return name;
    }
    //1.不能提供公共的构造器让外部调用new对象
    private Bank(){}
    //2.在类中new对象
    private static Bank instance=new Bank();
    //3.提供公共方法调用
    public static Bank getBank(){
        return instance;
    }
}
//懒汉实现单例模式
class Park{
    //1 同样不能提供公共的构造器
    private Park(){}
    //2 创建实例,但是不立即new
    private static Park park= null;
    //公共的方法获取单例
    public static Park getInstance(){
        if(park==null){
            //同步锁，保证线程安全
            synchronized (Park.class){
                if(park==null){ // 双重验证
                    park = new Park();
                }
            }
        }
        return park;
    }
}
